package modelo.tareas;

import java.util.Date;
import java.util.List;

import modelo.exception.NoPuedeIniciarException;
import modelo.exception.SameStateException;
import modelo.exception.StatusChangeException;

/**
 * @author Cristian
 *
 */

public class TareaSimple extends Tarea {

	//Constructor *********************************************************** //

	public TareaSimple(String nom, int impo, String finalizacionEstimada, int estimacion) {
		super(nom, impo, finalizacionEstimada, estimacion);
	}
	
	public TareaSimple(String nom, int impo, String finalizacionEstimada, int estimacion, Tarea predecesor) {
		super(nom, impo, finalizacionEstimada, estimacion, predecesor);
	}

	//GET&SET     *********************************************************** //
	/**
	 * Usado para la tarea Compuesta.
	 */
	public List<Tarea> getTareas() {
		return null;
	}
	
	//Metodos     *********************************************************** //
	/**
	 * Cambia el estado actual al estado Iniciado.
	 * Si no se puede cambiar lanza una excepcion.
	 * @throws StatusChangeException 
	 * @throws SameStateException 
	 * @throws NoPuedeIniciarException 
	 */
	public void iniciarTarea() throws SameStateException, StatusChangeException, NoPuedeIniciarException{
		if(this.puedeIniciar(this)){
			this.setEstado(this.estado.cambiarAIniciado());
		}
	}

	/**
	 * Se cambia el estado a estado iniciado llamando al metodo iniciarTarea().
	 * Ya que depende la reapertura de sus predecesoras.
	 * @throws StatusChangeException 
	 * @throws SameStateException 
	 * @throws NoPuedeIniciarException 
	 */
	public String reabrirTarea(String nota) throws SameStateException, StatusChangeException, NoPuedeIniciarException{
		this.iniciarTarea();
		return nota;
	}

	/**
	 * Se cambia el estado a estado finalizado
	 * @throws StatusChangeException 
	 * @throws SameStateException 
	 */
	public void finalizarTarea() throws SameStateException, StatusChangeException {
			this.setEstado(this.getEstado().cambiarAFinalizado());
			Date tiempoFinalizado = new Date();
			
			this.fechaFinalizacion = tiempoFinalizado;
			this.duracion += tiempoDeRealizacion(this.realizacion, tiempoFinalizado);
	}
	
	/**
	 * Se cambia el estado a estado pausado.
	 * @throws StatusChangeException 
	 * @throws SameStateException 
	 */	
	public void pausarTarea() throws SameStateException, StatusChangeException{
		this.setEstado(this.getEstado().cambiarAPausado());
		Date tiempoPausado = new Date();
		this.duracion += tiempoDeRealizacion(this.realizacion, tiempoPausado);
	}
	
	/**
	 * Se cambia el estado a estado cerrado.
	 * @throws StatusChangeException 
	 * @throws SameStateException 
	 */
	public void cerrarTarea() throws SameStateException, StatusChangeException{
		this.setEstado(this.getEstado().cambiarACerrado());
			
		if(this.realizacion == null){
			this.duracion = 0;
		}else{
			Date tiempoPausado = new Date();
			this.duracion += tiempoDeRealizacion(this.realizacion, tiempoPausado);}
	}

	public void trabajarTarea() throws SameStateException, StatusChangeException {

		this.setEstado(this.getEstado().cambiarAEnTrabajo());
		this.realizacion = new Date();
		
	}
	
	public int porcentajeDeRealizacion(){
		return (this.duracion * 100) / this.estimacion;
	}
	
	public String toString (){
		return "Tarea Simple"; 
	}
}
